package controlador;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Flujo;
import modelo.servicio.Flujos;

public class FlujoControlador extends HttpServlet {

    private String accion;
    private String usuario;
    private StringBuilder html;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        html = new StringBuilder("");
        accion = request.getParameter("ac") != null
                ? request.getParameter("ac") : "";
        usuario = request.getSession().getAttribute("sUsuario") != null
                ? request.getSession().getAttribute("sUsuario").toString() : "";
        try {
            if (accion.compareToIgnoreCase("ls") == 0) {
                List<Flujo> flujos = Flujos.instancia().todos();
                request.setAttribute("flujos", flujos);
                getServletContext().getRequestDispatcher("/front?v=2&ac=0").forward(request, response);
            } else if (accion.compareToIgnoreCase("sv") == 0) {
                String clave = request.getParameter("txt_clave");
                String descripcion = request.getParameter("txt_descripcion");
                String descripcionCorta = request.getParameter("txt_desc_corta");
                String montoValidado = request.getParameter("rdb_valida_monto");
                String comentarios = request.getParameter("txa_comentarios");
                Flujos.instancia().agregar(clave, descripcion, descripcionCorta,
                        "N", comentarios, montoValidado.equalsIgnoreCase("S"), usuario);
//                html.append("Se cre&oacute; correctamente el flujo: ").append(clave);
                html.append("<script type='text/javascript'>")
                        .append("charge('#ui-tabs-4', 'front?v=3&ac=1&clv=").append(clave.replace("'", "\\'")).append("');")
                        .append("</script>");
            } else if (accion.compareToIgnoreCase("ed") == 0) {
                String clave = request.getParameter("txt_clave");
                String descripcion = request.getParameter("txt_descripcion");
                String descripcionCorta = request.getParameter("txt_desc_corta");
                String montoValidado = request.getParameter("rdb_valida_monto");
                String comentarios = request.getParameter("txa_comentarios");
                Flujos.instancia().editar(clave, descripcion, descripcionCorta,
                        "N", comentarios, montoValidado.equalsIgnoreCase("S"), usuario);
                html.append("<script type='text/javascript'>")
                        .append("charge('#ui-tabs-4', 'front?v=3&ac=1&clv=").append(clave.replace("'", "\\'")).append("');")
                        .append("</script>");
            } else if (accion.compareToIgnoreCase("oc") == 0) {
                List<Flujo> flujosSolicitud = Flujos.instancia().paraCrear(usuario);
                generarOpcionesFlujo(flujosSolicitud);
            } else if (accion.compareToIgnoreCase("de") == 0) {
                String claveFlujo = request.getParameter("clvf");
                Flujo flujo = Flujos.instancia().porClave(claveFlujo);
                generarDetalleFlujo(flujo);
            } else if (accion.compareToIgnoreCase("co") == 0) {
                String claveFlujo = request.getParameter("clvf");
                String claveNueva = request.getParameter("txt_nw_clave");
                String error = Flujos.instancia().copiar(claveFlujo, claveNueva, usuario);
               if (error == null) {
                    html.append("Se copio el flujo: ").append(claveFlujo);
                    html.append("<script type='text/javascript'>")
                        .append("$('#tabs').tabs('load', 3).slideUp(500).fadeIn(500);")
                        .append("</script>");
                } else {
                    html.append("No fue posible copiar el flujo: ").append(claveFlujo);
                    html.append("<br/>Razon: ").append(error);
                    html.append("<br/><button type='reset' class='btn_regresar' ")
                        .append("title='Regresar a los Flujos'>Regresar</button>");
                    html.append("<script type='text/javascript'>")
                        .append("$('.btn_regresar').button({")
                        .append("   icons: {primary: 'ui-icon-arrowreturnthick-1-w'}")
                        .append("});")
                        .append("$('.btn_regresar').click(function() {")
                        .append("   $('#tabs').tabs('load', 3).slideUp(500).fadeIn(500);")
                        .append("});")
                        .append("</script>");
                }
            } else if (accion.compareToIgnoreCase("va") == 0) {
                String claveFlujo = request.getParameter("clvf");
                String error = Flujos.instancia().validar(claveFlujo, usuario);
                if (error == null) {
                    html.append("El flujo: ").append(claveFlujo).append(" es v&aacute;lido");
                    html.append("<script type='text/javascript'>")
                            .append("$('#tabs').tabs('load', 3).slideUp(500).fadeIn(500);")
                            .append("</script>");
                } else {
                    html.append("El flujo: ").append(claveFlujo).append(" no es v&aacute;lido");
                    html.append("<br/>Razon: ").append(error);
                    html.append("<button type='reset' class='btn_regresar' ")
                            .append("title='Regresar a los Flujos'>Regresar</button>");
                    html.append("<script type='text/javascript'>")
                            .append("$('.btn_regresar').button({")
                            .append("   icons: {primary: 'ui-icon-arrowreturnthick-1-w'}")
                            .append("});")
                            .append("$('.btn_regresar').click(function() {")
                            .append("   $('#tabs').tabs('load', 3).slideUp(500).fadeIn(500);")
                            .append("});")
                            .append("</script>");
                }
            } else if (accion.compareToIgnoreCase("in") == 0) {
                String clave = request.getParameter("clvf");
                Flujos.instancia().inactivar(clave, usuario);
                html.append("<script type='text/javascript'>")
                        .append("$('#tabs').tabs('load', 3).slideUp(500).fadeIn(500);")
                        .append("</script>");
            }
            out.println(html);
        } catch (DAOException dex) {
            out.println("Error en la base de datos: " + dex.getMessage());
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    private void generarOpcionesFlujo(List<Flujo> flujos) {
        if (!flujos.isEmpty()) {
            html.append("<select name='cmb_flujo'>");
            for (Flujo flujo : flujos) {
                html.append("<option value='").append(flujo.getClave()).append("'>");
                html.append(flujo.getClave()).append(" - ");
                if (!flujo.getDescripcionCorta().equalsIgnoreCase("")) {
                    html.append(flujo.getDescripcionCorta());
                } else {
                    if (flujo.getDescripcion().length() > 30) {
                        html.append(flujo.getDescripcion().substring(0, 30));
                    } else {
                        html.append(flujo.getDescripcion());
                    }
                }
                html.append("</option>");
            }
            html.append("</select>");
        }
    }

    private void generarDetalleFlujo(Flujo flujo) {
        html.append("<form id='frm_copiar' action='flu' name='frm_copiar'>")
                .append("<input type='hidden' name='ac' value='co'/>")
                .append("<input type='hidden' name='clvf' value='").append(flujo.getClave().replace("'", "&apos;")).append("'/>")
                .append("<font color='red'>*</font> <strong>Nueva Clave: </strong>")
                .append("<input type='text' name='txt_nw_clave' maxlength='4'  onkeyup=\"sinEspacioMayuscula('txt_nw_clave');\"/>")
                .append("</form>");
        html.append("<script type='text/javascript'>")
                .append("$('#frm_copiar').submit(")
                .append("   function() {")
                .append("      $.post('flu', $('#frm_copiar').serialize(), function(data) {")
                .append("         $('#ui-tabs-4').html(data);")
                .append("      }).error(function() {")
                .append("         $('#ui-tabs-4').html('<br/>Error al guardar.');")
                .append("      });")
                .append("      $('#ui-tabs-4').html(\"<p><img src='images/loading.gif'/><br/>Copiando...</p>\");")
                .append("      return false;")
                .append("   });")
                .append("</script>");
    }
}
